Info's zum nachlesen
Entwurfsmuster Visitor
Das Entwurfsmuster Visitor gehört zu der Gruppe der
Verhaltensmuster. Verhaltensmuster befassen sich mit Algorithmen und
der Zuweisung von Zuständigkeiten zu Objekten. Solche Muster
beschreiben nicht nur Muster von Objekten und Klassen sondern auch die
Muster der Interaktion zwischen ihnen. Verhaltensmuster beschreiben
komplexe Kontrollflüsse, die zur Laufzeit schwer nachvollziehbar sind.
Wobei hier nicht der Kontrollfluss sondern die Art und Weiße wie
Objekte mit einander interagieren von Bedeutung ist.
Mit dem Visitor Pattern ist es möglich verwandte Vorgänge auf
eine Gruppe von Klassen auszuführen und diese Operationen in einer
einzigen Klasse zu plazieren. Das Ziel des Pattern ist die
Code-Wartbarkeit. In solchen Situationen erschwert das halten der
Operationen in den jeweiligen Klassen die Code-Wartbarkeit. Das Visitor
Pattern stellt hier ein übergeordnetes Framework zu Verfügung welche
die Erweiterung und die Wartung des Codes erleichtert.
Das Visitor Entwurfsmuster wird eingesetzt wenn folgende drei Bedingungen erfüllt sind:
- Wenn ein System eine Reihe verwandter Klassen enthällt.
- Wenn nicht triviale Operationen auf eine Reihe oder auf alle Verwandten Klassen ausgeführt werden müssen.
- Wenn gemeinsame Operationen durchgeführt werden sollen, jedoch diese für die jeweiligen Klassen im Detail anders implementiert werden müssen.
UML-Notation
Das Muster fordert dass alle Klassen auf den dieses Muster Vorgänge
durchführt, diese werden auch Elemente genannt, in irgend einer Form
über die Methode "accept" verfügen. Die Accept-Methode eines Elementes
wird immer dann aufgerufen wenn der Visitor eine Operation auf dieses
Element anwenden will. Das Argument der Accept-Methode ist eine Instanz
eines Visitors. In der Implementierung der Accept-Methode wird die
visit-Methode des betretenden Visitors für die eigene Instance
aufgerufen. Die Visitor Implementierung enthält für jedes Teilelement
eine visit-Methode welches das Element spezifischen Operationen
schließlich ausführt.
Vor- und Nachteile
Vorteile:
- Aufgrund der Struktur des Visitor Patterns lässt sich ein System sehr einfach mit neuem Verhalten erweitern. Das Visitor Pattern dient als Framework für weitere Visitor. Durch erstellen einer Klasse, welche das Interface „Visitor“ implementiert kann ein bestehendes System an zukünftige Anforderungen leicht angepasst werden.
- Das Visitor Pattern ermöglicht die Zentralisierung von funktionellem Code. Durch Verwendung des Musters werden unterschiedliche Operationen auf unterschiedliche Objekte durchgeführt, die Implementierung der Operation befindet sich zentral in der Visitor-Klasse und muss nicht in den einzelnen Klassen ergänzt werden.
- Das Visitor Objekt wird verwendet um die Elemente einer Struktur zu besuchen, dadurch lassen sich Daten die gesammelt werden müssen oder auch Zwischenergebnisse von Operationen zentral sammeln, speichern und weiterverarbeiten.
Nachteile:
- Geringe Veränderungen der Elementklasse lösen mit einer hohen Wahrscheinlichkeit die Notwendigkeit aus die Visitor-Klasse zu überarbeiten.
- Bei jeder nachträglichen Einführung eines neuen Elementes muss das Visitor-Interface mit der entsprechenden visit-Methode für das neue Element erweitern werden. Bereits bestehende Konkrete Visitor, welches das Visitor-Interface implementieren, müssen mit der visit-Methode für das neue Element nachträglich erweitert werden.
- Das Muster verletzt das Prinzip der Codekapselung der Objektorientierten Programmierung. Das Visitor-Muster beinhaltet Code welcher auf eine Reihe unterschiedlicher Objekte angewendet wird, welche nicht in der eigenen Klasse enthalten sind. Ein Element der Struktur muss den Konkreten Visitor nicht kennen. Der Visitor muss jedoch die Elemente kennen, da er mit den Methoden der Elementklasse interagiert.
Varianten des Entwurfmusters
Wie bei vielen anderen Mustern können die Interfaces „Visitor“ und
„Element“ auch als abstrakte Klassen vorgegeben werden.
Die Traversierung der Struktur kann auch unterschiedliche Arten
umgesetzt werden. Die Traversierung der Struktur kann direkt in der
„KonkretVisitor“ Klasse erfolgen. Es ist auch möglich die Struktur mit
einer externen Klasse wie dem Iterator zu traversieren. Um diese
Funktionalität um zusetzen wird das Visitor Pattern mit dem
Iterator-Pattern kombiniert.
Verwandte Muster
Folgende Muster sind mit dem Visitor Patern verwandt. Sie gehören zu einer Reihe von Mustern die die in Verbindung mit Visitor Pattern verwendet werden um eine Struktur zu durchlaufen.
- Interpreter: Der Visitor wird hier eingesetzt um die Interpretation einer Operation zu zentralisieren.
- Iterator: Verwendung zum durchlaufen einer Struktur.
- Composite: Wird in Verbindung mit dem Visitor verwendet um Baumstrukturen zu durchlaufen.